Оператор scan

Оператор scan в RxJS используется для последовательного преобразования значений последовательности (Observable) на основе некоторой аккумулирующей функции и начального значения. Он похож на оператор reduce в JavaScript, но в отличие от reduce, scan испускает каждое промежуточное значение в процессе сканирования.

Давайте рассмотрим шаги и примеры кода для лучшего понимания оператора scan:

Шаг 1: Импорт оператора scan и необходимых функций из библиотеки RxJS:

import { scan } from 'rxjs/operators';
import { of } from 'rxjs';

Шаг 2: Создание Observable последовательности, для которой мы хотим использовать оператор scan:

const source$ = of(1, 2, 3, 4, 5);

Шаг 3: Использование оператора scan для преобразования значений последовательности:

const result$ = source$.pipe(
  scan((acc, curr) => acc + curr, 0)
);

Шаг 4: Подписка на результирующую последовательность и обработка ее значений:

result$.subscribe(value => console.log(value));

В результате выполнения этого кода мы получим следующий вывод:

1
3
6
10
15

Объяснение: Оператор scan последовательно применяет аккумулирующую функцию к значениям последовательности, сохраняя промежуточные результаты. В нашем примере, аккумулирующая функция (acc, curr) => acc + curr складывает текущее значение curr со значением аккумулятора acc. Начальное значение аккумулятора устанавливается равным 0. Каждый раз, когда поступает новое значение, оператор scan испускает текущий результат сканирования.

Таким образом, наша последовательность [1, 2, 3, 4, 5] преобразуется в последовательность промежуточных значений [1, 3, 6, 10, 15], которые выводятся в консоль.